﻿/*******************************************************
* Copyright (c) 2018-2088, By XuXiang all rights reserved.
*
* FileName: LoginModule.h
* Summary: 登陆模块。
*
* Author: XuXiang
* Date: 2024-04-10 15:23
*******************************************************/

#ifndef __LoginModule_h__
#define __LoginModule_h__

#include <Frame/ModuleBase.h>
#include "UserInfo.h"
#include <map>
using namespace std;

namespace Competition
{
	struct NetDataItem;
	typedef std::map<Int64, int> UIDToUserIDMap;

	//登陆模块
	class LoginModule : public ModuleBase
	{
	public:
		//角色ID序号占位
		static const int ROLE_ID_STAMP_BIT;

		//正常退出延迟
		static const int OUTLINE_DELAY_NORMAL;
		
		//异常掉线退出延迟
		static const int OUTLINE_DELAY_EXCEPTION;

		//构造析构函数
		LoginModule();
		virtual ~LoginModule();

		//注册网络消息
		virtual void RegisterNetMessage(NetManagerBase *pMgr);

		//注册存储消息
		virtual void RegisterStorageMessage(StorageManager* pMgr);

		//初始化配置列表
		virtual void AddConfig(vector<ModuleConfig*> &cfgs);

		//初始化
		virtual void Init();

		//销毁
		virtual void Release();

		//秒更新
		virtual void OnUpdatePerSecond();

		//通过用户ID获取用户信息
		UserInfo* GetUser(int user_id);

		//通过链接标识获取用户名
		UserInfo* GetUserByUID(Int64 uid);

		//通过用户名获取链接标识。
		Int64 GetUID(int user_id);

		void OnConnect(UInt64 uid);
		void OnDisconnect(UInt64 uid);

	private:

		//游客用户上线
		UserInfo* OnVisitorUserOnline(UInt64 uid, const string& did);

		//用户离线 uid:连接标识 type:掉线类型 0主动退出 1异常掉线
		void OnUserOutline(UInt64 uid, int type);
		
		void OnLoginRequest(NetDataItem *item);					//登陆请求
		void OnQuitRequest(NetDataItem* item);					//退出请求

		static void OnGetUserRequest(NetDataItem* item);		//请求用户数据
		void OnGetUserResponse(NetDataItem* item);				//回复用户数据
		static void OnAddUserRequest(NetDataItem* item);		//请求添加用户
		static void OnUpdateUserTimeRequest(NetDataItem* item);	//请求更新用户时间

		//用户信息
		UserInfoMap m_Users;

		//连接标识到用户ID的映射
		UIDToUserIDMap m_UIDToUserID;

		//要退出的用户
		UserInfoVector m_WantQuitUsers;
	};
}

#endif